package models

import (
	"gorm.io/gorm"
	"time"
	"user-srv/basic/inits"
)

// 会员表
type Member struct {
	Id          uint64         `gorm:"column:id;type:bigint UNSIGNED;primaryKey;not null;" json:"id"`
	UserId      uint64         `gorm:"column:user_id;type:bigint UNSIGNED;comment:用户id;not null;" json:"user_id"`              // 用户id
	MemberNo    string         `gorm:"column:member_no;type:varchar(50);comment:会员编号;not null;" json:"member_no"`              // 会员编号
	LeveId      uint64         `gorm:"column:leve_id;type:bigint UNSIGNED;comment:等级id;not null;" json:"leve_id"`              // 等级id
	TotalPoints uint32         `gorm:"column:total_points;type:int UNSIGNED;comment:总积分;not null;" json:"total_points"`        // 总积分
	JoinTime    time.Time      `gorm:"column:join_time;type:datetime(3);comment:加入时间;not null;" json:"join_time"`              // 加入时间
	OverTime    time.Time      `gorm:"column:over_time;type:datetime(3);comment:过期时间;not null;" json:"over_time"`              // 过期时间
	Status      uint32         `gorm:"column:status;type:int UNSIGNED;comment:状态 1-正常 2-过期;not null;default:1;" json:"status"` // 状态 1-正常 2-过期
	CreatedAt   time.Time      `gorm:"column:created_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"created_at"`
	UpdatedAt   time.Time      `gorm:"column:updated_at;type:datetime(3);not null;default:CURRENT_TIMESTAMP(3);" json:"updated_at"`
	DeletedAt   gorm.DeletedAt `gorm:"column:deleted_at;type:datetime(3);default:NULL;" json:"deleted_at"`
}

// 会员权益领取记录表
func (m *Member) TableName() string {
	return "member"
}

func (m *Member) GetMemberUser() error {
	return inits.DB.Where("user_id = ?", m.UserId).Limit(1).Find(&m).Error
}

// 会员添加
func (m *Member) MemberAdd() error {
	return inits.DB.Create(&m).Error
}

// 会员详情
func (m *Member) MemberDetails() error {
	return inits.DB.Where("user_id = ?", m.UserId).Limit(1).Find(&m).Error
}

// 计算精确的过期时间（自然月，当天23:59:59）
func CountMemberOverTime(startTime time.Time, months int) time.Time {
	// 先加上指定的月数
	expireTime := startTime.AddDate(0, months, 0)

	// 如果开始日期是某月的最后一天，保持到最后一天
	if startTime.Day() != startTime.AddDate(0, 1, -startTime.Day()).Day() {
		// 开始日期是某月的最后一天
		nextMonth := expireTime.AddDate(0, 1, 0)
		lastDay := time.Date(nextMonth.Year(), nextMonth.Month(), 1, 0, 0, 0, 0, nextMonth.Location()).Add(-time.Second)
		expireTime = lastDay
	}

	// 设置时间为当天的23:59:59
	return time.Date(expireTime.Year(), expireTime.Month(), expireTime.Day(),
		23, 59, 59, 0, expireTime.Location())
}
